package bench;

import com.zh.mycommon.util.MyIdGenerator;
import com.zh.mycommon.util.RandomCodeUtil;
import com.zh.mycommon.value.Tuple2;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.profile.GCProfiler;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.Throughput) // 吞吐量测试模式
@OutputTimeUnit(TimeUnit.SECONDS) // 输出单位为秒（ops/s）
@Warmup(iterations = 2, time = 3) // 预热 2 轮，每轮 3 秒
@Measurement(iterations = 5) // 测量 5 轮
@State(Scope.Thread) // 每个线程独立状态
public class Tuple2SortBenchmark {

    static String[][] stringArr = new String[100][2];

    static {
        // 循环生成每个子数组的随机字符
        for (int i = 0; i < stringArr.length; i++) {
            stringArr[i][0] = RandomCodeUtil.getCharacterCode(10,false);
            stringArr[i][1] = RandomCodeUtil.getCharacterCode(10,false);
        }
    }

    @Benchmark
    public void funByManualSorted() {
        for (int i = 0; i < stringArr.length; i++) {

            var u1 = stringArr[i][0];
            var u2 = stringArr[i][1];

            if (u1.compareTo(u2)> 0) {
                var t = u1;
                u1 = u2;
                u2 = t;
            }
            var ss = u1+u2;
        }
    }

    @Benchmark
    public void funByTupleSorted() {
        for (int i = 0; i < stringArr.length; i++) {
            var sorted = Tuple2.sorted(new Tuple2<>(stringArr[i][0], stringArr[i][1]));
            var ss = sorted.v1()+ sorted.v2();
        }
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(Tuple2SortBenchmark.class.getSimpleName())
                .forks(1)
                .threads(Runtime.getRuntime().availableProcessors()) // 使用真实线程数
                .jvmArgsAppend("-Xmx1024m", "-Xmx1024m")
                .addProfiler(GCProfiler.class)
                .resultFormat(ResultFormatType.JSON)
                .build();

        new Runner(opt).run();
    }
}
